本章節介紹ORM對資料庫的CURD方法,我們以上個章節介紹的student model 為例。
# -*- coding: utf-8 -*-
from odoo import api, models, fields
from odoo.exceptions import ValidationError
class ResStudent(models.Model):
_name = 'res.student'
_inherit = 'res.partner'
_description = 'Student'
nickname = fields.Char(string='綽號')
math_score = fields.Float(string='數學成績')
chinese_score = fields.Float(string='國文成績')
avg_score = fields.Float(string='學期平均', compute='_compute_score')
birthday = fields.Date(string='生日', required=True)
school_id = fields.Many2one('res.company', string='所屬學校')
school_city = fields.Char(string='所在城市', related='school_id.city')
senior_id = fields.Many2one('res.student', string='直屬學長姐')
junior_ids = fields.One2many('res.student', 'senior_id', string='直屬學弟妹')
teacher_ids = fields.Many2many('res.partner', string='指導老師', domain=[('is_company', '!=', True)])
gender = fields.Selection([("male", "男"), ("female", "女"), ("other", "其他")], string='性別')
is_leadership = fields.Boolean(default=False)
is_active = fields.Boolean(default=True)
新增方法很直觀,直接對新增的欄位create即可。
env['res.student'].create({'name': '王大明', 'nickname': '小明', 'birthday': '2000-01-01'})
當一個資料裡可能含有許多field,我們想要其中一份一樣的資料,為了方便就可以使用copy。
env['res.student'].search([('name', '=', '王大明')]).copy()
將當前的recordset根據指定的欄位修改
env['res.student'].search([('name', '=', '王大明')]).write({'nickname': '大明'})
要注意的是當需要新增或修改One2many
或Many2many
field時,ODOO有一套自己的寫法,這邊飲用ODOO的Document:
(0, 0, values)
adds a new record created from the provided value
dict.(1, id, values)
updates an existing record of id id
with the values in values
. Can not be used in create()(2, id, 0)
removes the record of id id
from the set, then deletes it (from the database). Can not be used in create()(3, id, 0)
removes the record of id id
from the set, but does not delete it. Can not be used in create()(4, id, 0)
adds an existing record of id id
to the set.(5, 0, 0)
removes all records from the set, equivalent to using the command 3
on every record explicitly. Can not be used in create()(6, 0, ids)
replaces all existing records in the set by the ids
list, equivalent to using the command 5
followed by a command 4
for each id
in ids
.舉個例子,當我想為王大明增加一位還沒建資料的學弟妹,並將一位id=2的同學因為他作弊,修改他的成績為零分
first_val = {'name': '林小美', 'birthday': '2001-03-03'}
second_val = {'math_score': 0}
env['res.student'].search([('name', '=', '王大明')]).write('junior_ids': [(0, 0, first_val), (1, 2, second_val)])
ODOO中的domain可以想成是query條件,search可以尋找所需要的資料集。
env['res.student'].search([('is_active', '=', True )], limit=10)
我們尋找還在學的學生10位,[('is_active', '=', True )]
為domain的寫法,前者為參數,中間為運算元(operator),後面為值。
與search()
方法相同,只是最後只會return資料個數。
根據給予的ids陣列,return 資料。
env['res.student'].browse([2,3,6])
檢查recordset是否存在
刪除資料集
env['res.student'].search([('name', '=', '王大明')]).unlink()
Model所有的介紹就到這邊,筆者介紹的大部分都是自己用過或是比較常看到的,更多相關的參數或方法可以參考ODOO Document,明天將會介紹到View的章節。